iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
AI/ ML & Data

Web仔也來學ML系列 第 23

Web仔也來學ML [Day 23] - 自注意力機制 (Self-attention) 概念篇

  • 分享至 

  • xImage
  •  

上一篇我們知道了一些在做深度學習時的小技巧,可以分成兩種情況:在training set上效果表現不好和在testing set上表現不好。我們知道說我們在training set上表現不好的時候,我們可能要重新設計我們的model的三大流程裏面的其中一個,比如選擇別的Activation Function,或者使用不同的Adaptive Learning Rate。而在testing set上表現不好的時候,我們可以用Early Stopping,讓我們的model在overfit之前就停下來;或是我們用Regularization來防止我們的參數變得很大;又或者我們可以使用Dropout,也就是在train model的時候讓一些神經元有一定的機率被丟棄,然後在testing的時候我們不丟棄任何的神經元,但是我們讓所有的神經元的weight都減少50%(假設你的dropout rate是50%)。

今天我們要介紹的是我們這個系列的文章的第二篇有關Network的架構——Self-attention。這個架構是爲了解決一件事,那就是當我們的input是一個比較複雜的input,而不是簡單的固定長度的vector的時候,我們就需要用到Self-attention這樣的架構。

https://ithelp.ithome.com.tw/upload/images/20241005/20162542XrSVA19s05.png

複雜的input

要説input有什麽好複雜的呢?我們可以用三個例子來向大家解釋:

  1. 文字
    假設或我們今天的input是一段文字,那麽我們對於每一個文字都需要用一個vector來表四,至於怎麽表示呢?最簡單的做法就是把每一個字做成one-hot encoding,也就是我們有一個很長很長的向量,這個向量的長度就是世界上所有文字加起來的總數,那麽比如説'cat'這個英文單字,一定包含在這個vector的其中一個,用1來表示,其他的地方則是用0來表示。可是這個one-hot vector有一個缺點,那就是它假設每個單字都是沒有關聯的。可是事實是這樣嗎?我們的每個單字實際上都是有關聯的,比如説動物的單字就有'cat', 'dog', 'elephant', 'bird' ...所以我們需要另外一個辦法來表示每個單字的vector,那個辦法就是word embedding。
    word embedding是一個unsupervised learning的方法,至於怎麽做word embedding這件事是另外一個議題,我們今天暫且不談,只要知道它是通過一個更高維的層面去考慮每個單字之間的關聯性,通過word embedding,我們就可以得到每個單字的vector,而一段文字裏面會有很多個單字,而每一句文字就是一排長度不一的向量。
    https://ithelp.ithome.com.tw/upload/images/20241005/20162542GYrH8ekdlB.png
  2. 語音
    當我們的input是語音的時候,一段聲音訊號其實是一排向量,我們會把一段聲音訊號取一個範圍,這個範圍叫做一個Window。把這個Window裡面的資訊描述成一個向量,這個向量就叫做一個Frame。通常這個Window的長度就是25ms(Millisecond),然後為了要描述一整段的聲音訊號,我們會把這個Window往右移一點,通常移動的大小是10ms。總之,一段聲音訊號就是用一串向量來表示,而因為每一個Window往右移都是移動10ms,所以一秒鐘的聲音訊號有100個向量,一分鐘的聲音訊號就有6000個向量。所以語音哪怕只有一小段的聲音訊號 它裡面包含的資訊量都是非常可觀的。所以聲音訊號也是一堆向量組成的。
    https://ithelp.ithome.com.tw/upload/images/20241005/20162542TpsIp7d2OD.png
  3. graph
    • 一個Graph(圖)也是一堆向量。舉例來説,Social Network就是一個Graph。在Social Network上面每一個節點就是一個人,然後節點跟節點之間的連接就是兩個人之間的關係,比如是不是朋友等等。每一個節點可以看作是一個向量,你可以拿一個人的資訊比如說性別、年齡、工作、講過的話等等,把這些資訊用一個向量來表示。所以一個Social Network是一個Graph,同時也可以看做是一堆的向量的組成。
      https://ithelp.ithome.com.tw/upload/images/20241005/20162542H4qj1EvLhw.png
    • 我們可以把一個分子當做是模型的輸入,每一個分子可以看作是一個Graph,分子上面的每一個球就是一個原子,也是一個向量。我們可以用One-Hot Vector來表示每一個原子,那一個分子就是一個Graph,它是由一堆向量(原子)所組成的。
      https://ithelp.ithome.com.tw/upload/images/20241005/201625427XHs3qhl7H.png

output

講完了輸入,現在讓我們來説一説輸出是什麽。我們可以將Self-attention的輸出分爲三個情況:

  1. 每個vector都有一個label
    eg.POS tagging(判斷一段文字的每個字是名詞、動詞……)、語音轉文字、Social Network的每個人買或不買某樣商品
  2. 整個sequence只有一個label
    eg.整段文字是正面的還是負面的或是中性的、判斷一段話的講者是哪一位
  3. 模型需要自己決定label的數量(seq2seq)
    eg.文字翻譯

https://ithelp.ithome.com.tw/upload/images/20241005/20162542xcq92e1J9a.png

那麽我們這次只會介紹三個output裏面的第一項,也就是每個vector都有一個label的情況,我們該怎麽做。這種輸入和輸出一樣多的情況,我們叫做Sequence Labeling,我們要對這個sequence裏面的每個向量都標上label。

如果用我們學過的Fully-Connected的Network來解這個問題,比如説判斷一個句子裏面的單字是哪一個詞類(名詞、形容詞、動詞……),如果一個句子遇到的兩次同一個單子,可是代表的意思完全不一樣,那麽我們就可能要考慮上下文,比如説設立一個window,把它前後的5個字一起包裹起來去計算等方法。可是要用著一個方法,我們就必須知道整個sequence裏面,最長的句子是哪一個,才有可能把整個我們要考慮的上下文囊括進來(因爲每個句子的長度可能是不一樣的,我們必須取最大的),這樣不僅計算量大,還會導致參數變得非常多,進而增加overfitting的可能性,所以我們不會用一個Fully-Connected的Network來做。至於具體怎麽用Self-attention來解決,就讓我們在下一篇娓娓道來。

以上的内容來自於臺大教授李宏毅:鏈接,我只是把他的影片寫成了筆記。


上一篇
Web仔也來學ML [Day 22] - 深度學習的小技巧
系列文
Web仔也來學ML23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言